package py.fpuna.ii.electiva2.client.clases;


import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import py.fpuna.ii.electiva2.client.GWTServiceComp;
import py.fpuna.ii.electiva2.client.GWTServiceCompAsync;

import py.fpuna.ii.electiva2.client.model.CompraModel;
import py.fpuna.ii.electiva2.client.model.ProductoModel;
import py.fpuna.ii.electiva2.client.model.ProveedorModel;

/**
 *
 * @author sebastian
 */
public class ABMCompras extends VerticalPanel{

    ABMCompras miABM;
    FlexTable datos = new FlexTable();

    TextBox textCantidad = new TextBox();
    ListBox listProv = new ListBox();
    ListBox listProducto = new ListBox();
    

    Button guardar = new Button("Agregar");
    private Label resultado = new Label();

    FlexTable tablaCompras = new FlexTable();
    java.util.List <Integer> listCodeProv = new ArrayList<Integer>();

    CompraModel comprafinal = new CompraModel();

    ProductoModel prodM = new ProductoModel();
    Integer codproducto = 0;
    

    public ABMCompras()
    {
        datos.setText(0, 0, "Cantidad");
        datos.setText(1, 0, "Proveedor");
        datos.setText(1, 2, "Producto");
        
        datos.setWidget(0,1, this.textCantidad);
        datos.setWidget(1,1, this.listProv);
        datos.setWidget(1,3, this.listProducto);
        
        miABM = this;   //me referencio a mi mismo
        miABM.add(datos);
        miABM.add(guardar);
        Window.setTitle("TAREA GWT - EJB");

        cargarListaProv();

        miABM.add(resultado);
        mostrarTabla(); //reconstruye la tabla

        guardar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                agregarCompra();
            }
        });

        listProv.addChangeHandler(new ChangeHandler() {
            public void onChange(ChangeEvent event) {
                int elegido = listProv.getSelectedIndex();
                listProducto.clear();
                if (elegido > 0)
                    mostrarProductos(elegido);
            }

        });

    }

    public static GWTServiceCompAsync getService() {
        // Create the client proxy. Note that although you are creating the
        // service interface proper, you cast the result to the asynchronous
        // version of the interface. The cast is always safe because the
        // generated proxy implements the asynchronous interface automatically.

        return GWT.create(GWTServiceComp.class);
    }

     /**
     * agrega un cliente a la BD
     */
    private void agregarCompra()
    {


        String can = this.textCantidad.getText();
        Integer codproveedor = 0;
        
        int iprov= listProv.getSelectedIndex();
        int iprod= listProducto.getSelectedIndex();

        if ((iprov > 0) && (iprod > 0))
        {
            codproveedor= Integer.parseInt(listProv.getValue(iprov));
            codproducto = Integer.parseInt(this.listProducto.getValue(iprod));
        }

        if ( can.compareTo("") == 0 ||
             codproveedor < 0 ||
             codproducto < 0 )
        {
            Window.setTitle("TAREA GWT - EJB");
            Window.alert("Debe cargar todos los campos");
            textCantidad.setFocus(true);
            return;
        }

        

        comprafinal.setCompCantidad(Integer.parseInt(can));
        comprafinal.setCompProveedor(codproveedor);

        // Create an asynchronous callback to handle the result.
        final AsyncCallback<String> callback3 = new AsyncCallback<String>() {
            public void onSuccess(String result) {
                if (result.equalsIgnoreCase("true")){
                    Window.alert("Registro guardado satisfactoriamente");
                    mostrarTabla();
                }else{
                    Window.alert("Error. La compra no se puede efectuar");
                   
                }
            }
            public void onFailure(Throwable caught) {
                Window.alert("Error. Ingrese palabras mas cortas en los campos");
            }
        };

       getService().guardarCompra(comprafinal,codproducto, callback3);

       codproducto = 0;

    }

    /**
     * muestra la tabla, contruyendola a partir de los datos
     * de la BD
     */
    private void mostrarTabla(){
        miABM.remove(tablaCompras);
        tablaCompras = new FlexTable();

        final AsyncCallback< List<CompraModel> > callback4 = new AsyncCallback< List<CompraModel> >() {
            public void onSuccess(List<CompraModel> result) {
                tablaCompras.setWidth("800px");
                tablaCompras.setBorderWidth(1);

                tablaCompras.setText(0, 0, "Cantidad");
                tablaCompras.setText(0, 1, "Proveedor");
                tablaCompras.setText(0, 2, "Producto");
               
                if (result == null){
                    resultado.setText("No hay datos en la tabla");
                }else{  //recibi datos en result

                    Iterator <CompraModel> compIt = result.iterator();
                    int f = 1;

                    while(compIt.hasNext()){

                        CompraModel compM = compIt.next();


                        tablaCompras.setWidget(f, 0, new Label(compM.getCompCantidad().toString()));
                        tablaCompras.setWidget(f, 1, new Label(compM.getCompProducto().getProdProveedor().getProvRazonSocial()));
                        tablaCompras.setWidget(f, 2, new Label(compM.getCompProducto().getProdDescripcion()));
                     
                        f++;
                    }
                }
                
                miABM.add(tablaCompras); //cargo la tabla en mi mismo
            }

            public void onFailure(Throwable caught) {
                resultado.setText("Fallo la comunicacion");
            }
        };

        getService().listarCompra(callback4);
    }


    private void cargarListaProv(){
        final AsyncCallback< List<ProveedorModel> > callback =new AsyncCallback< List<ProveedorModel> >() {
            
             public void onSuccess(List<ProveedorModel> result) {

                 Iterator<ProveedorModel> itProv = result.iterator();

                 listProv.addItem("<<seleccione un proveedor>>","0");
                 while (itProv.hasNext()){
                     ProveedorModel provm = itProv.next();
                     listProv.addItem(provm.getProvRazonSocial(), provm.getProvCodigo().toString());
                 }
                 
            }
             
            public void onFailure(Throwable caught) {
                resultado.setText("Falló la comunicación");
            }

        };

        getService().listarProveedores(callback);
    }


    /**
     * muestra la lista de productos de ese proveedor
     * @param index
     */
    private void mostrarProductos(Integer index){
        Integer codProv = Integer.parseInt(listProv.getValue(index));

        final AsyncCallback< List<ProductoModel> > callback1 =new AsyncCallback< List<ProductoModel> >() {

             public void onSuccess(List<ProductoModel> result) {
                 listProducto.clear();
                 if (result.isEmpty()){
                    Window.alert("Este proveedor no tiene productos :(");
                 }else{
                     Iterator<ProductoModel> itProd = result.iterator();
                     listProducto.addItem("<<seleccione un producto>>", "0");
                     while (itProd.hasNext()){
                         ProductoModel prodm = itProd.next();
                         listProducto.addItem(prodm.getProdDescripcion(), prodm.getProdCodigo().toString());
                     }
                     
                 }
            }

            public void onFailure(Throwable caught) {
                resultado.setText("Falló la comunicación");
            }

        };

        getService().listarProductos(codProv,callback1);

    }

}
